// 购物车模块
import { INSERT_CART, DELETE_CART, GET_CART, UPDATE_CART } from './actionTypes'
import { getNewCartGoods,mergeLocalCart  } from '@/api/cart'
// 购物车状态
export default {
  namespaced: true,

  state() {
    return {
      list: []
    }
  },
  getters: {
    // 有效商品列表
    validList(state) {
      return state.list.filter(item => item.stock > 0 && item.isEffective)
    },
    // 有效商品件数
    validTotal(state, getters) {
      return getters.validList.reduce((p, c) => p + c.count, 0)
    },
    // 有效商品总金额
    validAmount(state, getters) {
      return getters.validList.reduce((p, c) => p + c.nowPrice * 100 * c.count, 0) / 100
    },
    // 无效商品列表
    invalidList (state) {
      return state.list.filter(item => !(item.stock > 0 && item.isEffective))
    },
    // 选中商品列表
    selectedList (state, getters) {
      return getters.validList.filter(item => item.selected)
    },
    // 选中商品件数
    selectedTotal (state, getters) {
      return getters.selectedList.reduce((p, c) => p + c.count, 0)
    },
    // 选中商品总金额
    selectedAmount (state, getters) {
      return getters.selectedList.reduce((p, c) => p + (c.nowPrice * 100 * c.count), 0) / 100
    },
    // 是否全选
    isCheckAll (state, getters) {
      return getters.validList.length === getters.selectedList.length && getters.selectedList.length !== 0
    }
  },
  mutations: {
    [DELETE_CART](state, skuId) {
      const index = state.list.findIndex(item => item.skuId === skuId)
      state.list.splice(index, 1)
    },
    [UPDATE_CART](state, goods) {
      // goods中字段有可能不完整，goods有的信息才去修改。
      // 1. goods中必需又skuId，才能找到对应的商品信息
      const updateGoods = state.list.find(item => item.skuId === goods.skuId)
      for (const key in goods) {
        if (goods[key] !== null && goods[key] !== undefined && goods[key] !== '') {
          updateGoods[key] = goods[key]
        }
      }
    },
    [INSERT_CART](state, goods) {
      const sameIndex = state.list.findIndex(item => item.skuId === goods.skuId)
      // 逻辑：有相同的给goods累加数量，删除相同skuId的商品
      if (sameIndex >= 0) {
        goods.count = state.list[sameIndex].count + goods.count
        // 删除旧的
        state.list.splice(sameIndex, 1)
      }
      // 追加新的
      state.list.unshift(goods)
    },
       // 设置购物车列表
       setCartList (state, list) {
        state.list = list
      }
  },
  actions: {
    
    [DELETE_CART](ctx, skuId) {
      return new Promise((resolve, reject) => {
        if (ctx.rootState.user.userInfo.token) {
          // 登录 TODO
        } else {
          // 本地
          ctx.commit(DELETE_CART, skuId)
          resolve()
        }
      })
    },
    [GET_CART](ctx) {
      return new Promise((resolve, reject) => {
        if (ctx.rootState.user.userInfo.token) {
          // 登录 TODO
        } else {
          // 本地
          // Promise.all() 可以并列发送多个请求，等所有请求成功，调用then
          // Promise.race() 可以并列发送多个请求，等最快的请求成功，调用then
          // 传参事promise数组
          const promiseArr = ctx.state.list.map(item => {
            // 返回接口函数的调用
            return getNewCartGoods(item.skuId)
          })
          Promise.all(promiseArr).then(dataArr => {
            dataArr.forEach((data, i) => {
              ctx.commit(UPDATE_CART, { skuId: ctx.state.list[i].skuId, ...data.result })
            })
            resolve()
          }).catch(err => {
            reject(err)
          })
        }
      })
    },
    [INSERT_CART](ctx, goods) {
      return new Promise((resolve, reject) => {
        if (ctx.rootState.user.userInfo.token) {
          // 已登录 TODO

        } else {
          // 未登录
          ctx.commit(INSERT_CART, goods)
          resolve()
        }
      })
    },
    // 修改购物车商品
    [UPDATE_CART] (ctx, goods) {
      // goods 中：必须有skuId，其他想修改的属性 selected  count
      return new Promise((resolve, reject) => {
        if (ctx?.rootState?.user?.profile?.token) {
          // 登录 TODO
        } else {
          // 本地
          ctx.commit(UPDATE_CART, goods)
          resolve()
        }
      })
    },
     // 做有效商品的全选&反选
     checkAllCart (ctx, selected) {
      return new Promise((resolve, reject) => {
        if (ctx?.rootState?.user?.profile?.token) {
          // 登录 TODO
        } else {
          // 本地
          // 1. 获取有效的商品列表，遍历的去调用修改mutations即可
          ctx.getters.validList.forEach(item => {
            ctx.commit(UPDATE_CART, { skuId: item.skuId, selected })
          })
          resolve()
        }
      })
    },
     // 批量删除选中商品
     batchDeleteCart (ctx,isClear) {
       console.log('输出isClear', isClear)
       console.log('输出',ctx.getters.invalidList )
      return new Promise((resolve, reject) => {
        if (ctx?.rootState?.user?.profile?.token) {
          // 登录 TODO
        } else {
          // 本地
          // 1. 获取选中商品列表，进行遍历调用deleteCart mutataions函数
          ctx.getters[isClear ? 'invalidList' : 'selectedList'].forEach(item => {
        
            ctx.commit('DELETE_CART', item.skuId)
          })
          resolve()
        }
      })
    },
      // 修改sku规格函数
      updateCartSku (ctx, { oldSkuId, newSku }) {
        return new Promise((resolve, reject) => {
          if (ctx.rootState.user.profile.token) {
            // 登录 TODO
          } else {
            // 本地
            // 但你修改了sku的时候其实skuId需要更改，相当于把原来的信息移出，创建一条新的商品信息。
            // 1. 获取旧的商品信息
            const oldGoods = ctx.state.list.find(item => item.skuId === oldSkuId)
            // 2. 删除旧的商品
            ctx.commit('deleteCart', oldSkuId)
            // 3. 合并一条新的商品信息
            const { skuId, price: nowPrice, inventory: stock, specsText: attrsText } = newSku
            const newGoods = { ...oldGoods, skuId, nowPrice, stock, attrsText }
            // 4. 去插入即可
            ctx.commit('insertCart', newGoods)
          }
        })
      },
        // 合并本地购物车
    async mergeLocalCart (ctx) {
      // 存储token后调用合并API接口函数进行购物合并
      const cartList = ctx.getters.validList.map(({ skuId, selected, count }) => {
        return { skuId, selected, count }
      })
      await mergeLocalCart(cartList)
      // 合并成功将本地购物车删除
      ctx.commit('setCartList', [])
    },
  }
}
